Data storage systems are arrangements of hardware and software that typically include multiple storage processors coupled to arrays of non-volatile storage devices, such as magnetic disk drives, electronic flash drives, and/or optical drives. The storage processors service host I/O requests that arrive from host machines. The received I/O requests specify storage objects (e.g. logical disks or “LUNs”) that are to be written, read, created, or deleted. The storage processors run software that manages incoming I/O operations and performs various data processing tasks to organize and secure the host data stored on the non-volatile storage devices.
Previous data storage systems have applied performance controls when servicing host I/O requests, in order to meet service level objectives (SLOs) associated with storage objects. As it is generally known, the performance of a storage object may be measured in terms of an average response time for completing host I/O requests directed to the storage object. When the response time for host I/O requests directed to a storage object is greater than a response time SLO associated with the storage object, the storage object is said to be “under-achieving.” When the response time for host I/O requests directed to a storage object is less than a response time SLO associated with the storage object, the storage object is said to be “over-achieving.”
Previous data storage systems have also monitored the performance of individual hardware components that are used to service host I/O requests, in terms of performance indicators that were available for individual hardware components such as utilization, response time and workload. Upper limits have been defined for individual hardware components in terms of utilization, response time, and workload. Overloading of specific hardware components has been detected when limits on the monitored performance indicators were exceeded for the hardware components. Previous systems have applied performance controls to attempt to balance the workload of a data storage system across its various internal hardware components, in order to minimize the frequency and/or probability that any given component becomes overloaded.